package org.holoeverywhere.slider; import android.os.BadParcelableException; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import org.holoeverywhere.app.Fragment; import java.util.ArrayList; import java.util.List; public class SliderItem extends BaseSliderItem<SliderItem> implements Parcelable, IMenuAdder<SliderSubItem> { public static final Parcelable.Creator<SliderItem> CREATOR = new Parcelable.Creator<SliderItem>() { @Override public SliderItem[] newArray(int size) { return new SliderItem[size]; } @Override public SliderItem createFromParcel(Parcel source) { try { return new SliderItem(source); } catch (Exception e) { throw new BadParcelableException(e); } } }; protected List<SliderSubItem> mSubItems; public SliderItem() { super(); } protected SliderItem(Parcel source) throws Exception { super(source); mSubItems = source.createTypedArrayList(SliderSubItem.CREATOR); } @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeTypedList(mSubItems); } @Override public SliderSubItem add(CharSequence label) { return add(label, null, null, null); } @Override public SliderSubItem add(CharSequence label, int[] colors) { return add(label, null, null, colors); } @Override public SliderSubItem add(CharSequence label, Class<? extends Fragment> fragmentClass) { return add(label, fragmentClass, null, null); } @Override public SliderSubItem add(CharSequence label, Class<? extends Fragment> fragmentClass, Bundle fragmentArguments) { return add(label, fragmentClass, fragmentArguments, null); } @Override public SliderSubItem add(CharSequence label, Class<? extends Fragment> fragmentClass, int[] colors) { return add(label, fragmentClass, null, colors); } @Override public SliderSubItem add(CharSequence label, Class<? extends Fragment> fragmentClass, Bundle fragmentArguments, int[] colors) { if (mSliderMenu == null) { // Very bad throw new RuntimeException("SliderItem hasn't attached to SliderMenu, I cannot do anything!"); } return add(new SliderSubItem() .setLabel(label) .setFragmentClass(fragmentClass) .setFragmentArguments(fragmentArguments) ).fillColors(colors); } @Override public SliderSubItem add(int label) { return add(label, null, null, null); } @Override public SliderSubItem add(int label, int[] colors) { return add(label, null, null, colors); } @Override public SliderSubItem add(int label, Class<? extends Fragment> fragmentClass) { return add(label, fragmentClass, null, null); } @Override public SliderSubItem add(int label, Class<? extends Fragment> fragmentClass, Bundle fragmentArguments) { return add(label, fragmentClass, fragmentArguments, null); } @Override public SliderSubItem add(int label, Class<? extends Fragment> fragmentClass, int[] colors) { return add(label, fragmentClass, null, colors); } @Override public SliderSubItem add(int label, Class<? extends Fragment> fragmentClass, Bundle fragmentArguments, int[] colors) { if (mSliderMenu == null) { // Very bad throw new RuntimeException("SliderItem hasn't attached to SliderMenu, I cannot do anything!"); } return add(mSliderMenu.getActivity().getText(label), fragmentClass, fragmentArguments, colors); } @Override public SliderSubItem add(SliderSubItem item) { if (item.mSliderMenu != null || item.mParentItem != null) { throw new IllegalArgumentException("SubItem already has a parent: " + item + " (" + item.mSliderMenu + ")"); } item.mSliderMenu = mSliderMenu; item.mParentItem = this; item.mBackgroundColor = mBackgroundColor; item.mSelectionHandlerColor = mSelectionHandlerColor; obtainSubItemsList().add(item); mSliderMenu.notifyChanged(); return item; } @Override public SliderSubItem add(SliderSubItem item, int position) { if (item.mSliderMenu != null || item.mParentItem != null) { throw new IllegalArgumentException("SubItem already has a parent: " + item + " (" + item.mSliderMenu + ")"); } item.mSliderMenu = mSliderMenu; item.mParentItem = this; item.mBackgroundColor = mBackgroundColor; item.mSelectionHandlerColor = mSelectionHandlerColor; obtainSubItemsList().add(position, item); mSliderMenu.notifyChanged(); return item; } private List<SliderSubItem> obtainSubItemsList() { if (mSubItems == null) { mSubItems = new ArrayList<SliderSubItem>(); } return mSubItems; } public boolean hasSubItems() { return mSubItems != null && mSubItems.size() > 0; } }